﻿namespace Corporation.Project.Database
{
    /// <summary>
    /// 数据库视图：View_Demo
    /// </summary>
    [Description("数据库视图示例")]
    public class View_Demo : ViewHandlerBase
    {
        /// <summary>
        /// 初始化一个 <see cref="View_Demo"/> 的新实例
        /// </summary>
        /// <param name="serviceProvider">服务提供者</param>
        public View_Demo(IServiceProvider serviceProvider)
            : base(serviceProvider)
        { }

        /// <summary>
        /// 获取 是否应用所有的数据上下文
        /// <para>默认 false，如果为 true，则忽略 DbContextTypes 属性。</para>
        /// </summary>
        public override bool AllDbContext => false;

        /// <summary>
        /// 获取 所属的数据上下文类型集合
        /// <para>如集合为空且 AllDbContext 为 false 时，将使用默认上下文，否则使用指定类型的上下文类型。</para>
        /// </summary>
        public override Type[] DbContextTypes => [typeof(DefaultDbContext)];

        protected override string GetName(DatabaseType databaseType)
        {
            var name = string.Empty;
            switch (databaseType)
            {
                case DatabaseType.Sqlite:
                    break;
                case DatabaseType.MySql:
                case DatabaseType.SqlServer:
                case DatabaseType.PostgreSql:
                case DatabaseType.Oracle:
                    name = "View_Demo";
                    break;
            }
            return name;
        }

        protected override string GetCreateScript(DatabaseType databaseType)
        {
            var script = "";
            //可根据不同的数据库类型返回对应的脚本
            switch (databaseType)
            {
                case DatabaseType.MySql:
                case DatabaseType.Oracle:
                case DatabaseType.PostgreSql:
                case DatabaseType.Sqlite:
                case DatabaseType.SqlServer:
                    // 重要：如果系统中定义了 Entity 实体通过 DataBaseViewAttribute 属性映射，请保证脚本返回的字段与 Entity 属性映射保持一致。
                    script = @$"CREATE VIEW `{GetName(databaseType)}`
                                AS 
                                SELECT * FROM project_article";
                    break;
            }
            return script;
        }
      
        protected override string GetUpdateScript(DatabaseType databaseType)
        {
            var script = "";
            //可根据不同的数据库类型返回对应的脚本
            switch (databaseType)
            {
                case DatabaseType.MySql:
                case DatabaseType.Oracle:
                case DatabaseType.PostgreSql:
                case DatabaseType.Sqlite:
                case DatabaseType.SqlServer:
                    // 重要：如果系统中定义了 Entity 实体通过 DataBaseViewAttribute 属性映射，请保证脚本返回的字段与 Entity 属性映射保持一致。
                    script = @$"ALTER VIEW  `{GetName(databaseType)}` 
                                AS
                                select *,1 as test1 from project_article";
                    break;
            }
            return script;
        }

        /// <summary>
        /// 获取删除脚本
        /// </summary>
        /// <param name="databaseType">数据库类型</param>
        /// <returns>删除脚本字符串</returns>
        protected override string GetDeleteScript(DatabaseType databaseType)
        {
            var script = "";
            //可根据不同的数据库类型返回对应的脚本
            switch (databaseType)
            {
                case DatabaseType.MySql:
                case DatabaseType.Oracle:
                case DatabaseType.PostgreSql:
                case DatabaseType.Sqlite:
                case DatabaseType.SqlServer:
                    script = @$"DROP VIEW `{GetName(databaseType)}`";
                    break;
            }
            return script;
        }

    }
}
